/**
 * @author Jorge Mejuto Created on 11-mar-2005
 */
package net.eyra.negocio.explotacion.produccion;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

import net.eyra.negocio.aplicacion.Constantes;
import net.eyra.negocio.entidades.explotacion.Lectura;
import net.eyra.utiles.Numeros;
import net.eyra.utiles.XLSDao;

class CurvasDeCargaAExcel {

    private final String CABECERA_ACTIVA_EXPORTADA_CAPADA = "Exp. Ltda.";
    private final String CABECERA_FECHA = "Fecha";
    private final String CABECERA_HORA = "Hora";
    private final String CABECERA_ACTIVA_EXPORTADA = "Act. Exp.";
    private final String CABECERA_ACTIVA_IMPORTADA = "Act. Imp.";
    private final String CABECERA_REACTIVA_Q1 = "Reac. Q1";
    private final String CABECERA_REACTIVA_Q2 = "Reac. Q2";
    private final String CABECERA_REACTIVA_Q3 = "Reac. Q3";
    private final String CABECERA_REACTIVA_Q4 = "Reac. Q4";
    private final String CABECERA_HORARIO_ANO = "Horario";
    private final String CABECERA_PERIODO_DIA = "Periodo";
    private final String CABECERA_TIPO_REACTIVA = "Ind./Cap.";
    private final String CABECERA_FACTOR_POTENCIA = "Fact. Pot.";
    private final String CABECERA_BONIFICACION = "Bonifición";
    private final String CABECERA_BONIFICACION_EUROS = "Bon. Euro";
    private final String CABECERA_BONIFICACION_MAXIMA = "Bon. Máx.";
    private final String CABECERA_BONIFICACION_MAXIMA_EUROS = "Bon. Máx. Eur.";
    private final String CABECERA_DIFERENCIA_BONIFICACION_BINIFICACION_MAXIMA = "Dif.Bonif.";
    private final String CABECERA_PORCENTAJE_BONIFICACION = "% Bonificación";

    private XLSDao dao = null;

    public CurvasDeCargaAExcel() {
    }

    protected void generarHoja(ArrayList<Lectura> lecturas, String tipo, boolean reactiva, int consigna) {
        Produccion produccion = null;
        if (reactiva) produccion = new Produccion();

        SimpleDateFormat sdf = new SimpleDateFormat();
        if (lecturas == null || lecturas.size() < 1) {
            dao = new XLSDao();
            dao.iniciar();
        } else {
            Iterator<Lectura> iterator = lecturas.iterator();
            Lectura lectura;

            String nombre_hoja = "";
            int contador_filas = 2;
            boolean cambiar = true;

            double bonifcacion_euros_total = 0;
            double activa_exportada_total = 0;

            while (iterator.hasNext()) {
                lectura = iterator.next();
                sdf.applyLocalizedPattern("MM-yyyy");
                if (cambiar) {
                    nombre_hoja = tipo.toUpperCase() + "_" + sdf.format(new Date(lectura.getFecha().getTime()));
                    if (dao == null) {
                        dao = new XLSDao();
                        dao.iniciar(nombre_hoja);
                    } else dao.crearHoja(nombre_hoja);
                    escribirCabecera(reactiva);
                    contador_filas = 2;
                    cambiar = false;
                }
                if (!nombre_hoja.endsWith(sdf.format(new Date(lectura.getFecha().getTime())))) cambiar = true;

                dao.crearFila(contador_filas);
                contador_filas++;
                dao.crearCelda(1);
                dao.setAnchoColumna((short) 1, 16);
                sdf.applyLocalizedPattern("dd/MM/yyyy");
                dao.escribirTexto(sdf.format(new Date(lectura.getFecha().getTime())));
                dao.crearCelda(2);
                sdf.applyLocalizedPattern("HH:mm");
                dao.escribirTexto(sdf.format(new Date(lectura.getFecha().getTime())));
                dao.crearCelda(3);
                dao.escribirNumero(lectura.getActiva_importada());
                dao.crearCelda(4);
                dao.escribirNumero(lectura.getActiva_exportada());
                dao.crearCelda(5);
                dao.escribirNumero(lectura.getReactiva_q1());
                dao.crearCelda(6);
                dao.escribirNumero(lectura.getReactiva_q2());
                dao.crearCelda(7);
                dao.escribirNumero(lectura.getReactiva_q3());
                dao.crearCelda(8);
                dao.escribirNumero(lectura.getReactiva_q4());

                if (reactiva) {
                    String horario = (Produccion.EsHorarioVerano(lectura.getFecha()) ? "Verano" : "Invierno");
                    int _periodo = 0;
                    try {
                        _periodo = produccion.PeriodoDia(lectura.getFecha());
                    } catch (NumberFormatException e) {
                        e.printStackTrace();
                    }
                    String periodo = "Valle";
                    int maxima_bonificacion = Constantes.MAXIMA_BONIFICACION_VALLE;

                    switch (_periodo) {
                        case Constantes.PERIODO_PUNTA:
                            periodo = "Punta";
                            maxima_bonificacion = Constantes.MAXIMA_BONIFICACION_PUNTA;
                            break;
                        case Constantes.PERIODO_LLANO:
                            periodo = "LLano";
                            maxima_bonificacion = Constantes.MAXIMA_BONIFICACION_LLANO;
                            break;
                    }

                    int inductiva = Produccion.InductivaCapacitiva(lectura.getReactiva_q2(), lectura.getReactiva_q3(), lectura.getActiva_exportada());
                    String tipo_reactiva = "";
                    switch (inductiva) {
                        case 1:
                            tipo_reactiva = "Induct.";
                            break;
                        case 2:
                            tipo_reactiva = "Capacit.";
                            break;
                    }

                    double activa = lectura.getActiva_exportada() * lectura.getTarificador().getCoeficiente_perdida();

                    activa = (activa > lectura.getTarificador().getPotencia_autorizada() ? lectura.getTarificador().getPotencia_autorizada() : activa);

                    double factor_potencia = Produccion.Factor_Potencia(activa, lectura.getReactiva_q2(), lectura.getReactiva_q3());
                    int bonificacion = produccion.BonificacionFactorPotencia(factor_potencia, inductiva, _periodo, consigna);
                    double bonifcacion_euros = produccion.BonificacionComplementoReactiva(bonificacion, activa) / 100;
                    double maxima_bonificacion_euros = produccion.BonificacionComplementoReactiva(produccion.BonificacionFactorPotenciaMaxima(_periodo),
                                                                                                  activa);

                    bonifcacion_euros_total += bonifcacion_euros;
                    activa_exportada_total += activa;

                    dao.crearCelda(9);
                    dao.escribirTexto(" ");
                    dao.crearCelda(10);
                    dao.escribirTexto(horario, dao.getColorFondo(XLSDao.COLOR_ORO));
                    dao.crearCelda(11);
                    dao.escribirTexto(periodo, dao.getColorFondo(XLSDao.COLOR_ORO));
                    dao.crearCelda(12);
                    dao.escribirTexto(tipo_reactiva, dao.getColorFondo(XLSDao.COLOR_ORO));
                    dao.crearCelda(13);
                    dao.escribirNumero(Numeros.Redondeo(factor_potencia, 2), dao.getColorFondo(XLSDao.COLOR_ORO));
                    dao.crearCelda(14);
                    dao.escribirNumero(bonificacion, dao.getColorFondo(XLSDao.COLOR_ORO));
                    dao.crearCelda(15);
                    dao.escribirNumero(maxima_bonificacion, dao.getColorFondo(XLSDao.COLOR_ORO));
                    dao.crearCelda(16);
                    dao.escribirNumero(bonifcacion_euros, dao.getColorFondo(XLSDao.COLOR_ORO));
                    dao.crearCelda(17);
                    dao.escribirNumero(maxima_bonificacion_euros, dao.getColorFondo(XLSDao.COLOR_ORO));
                    dao.crearCelda(18);
                    dao.escribirNumero(maxima_bonificacion_euros - bonifcacion_euros, dao.getColorFondo(XLSDao.COLOR_ORO));
                    dao.crearCelda(19);
                    dao.escribirNumero(activa, dao.getColorFondo(XLSDao.COLOR_ORO));
                }
            }
            if (reactiva) {
                double bonifiacion_complemento_reactiva = bonifcacion_euros_total / (activa_exportada_total * Constantes.TARIFA_REACTIVA) * 10000;
                dao.crearCelda(22);
                dao.escribirNumero(2, 22, bonifiacion_complemento_reactiva, dao.getColorFondo(XLSDao.COLOR_AZUL));
            }
        }
    }

    protected void generarHojaDia(ArrayList<Lectura> lecturas, boolean reactiva) {
        SimpleDateFormat sdf = new SimpleDateFormat();
        if (lecturas == null || lecturas.size() < 1) {
            dao = new XLSDao();
            dao.iniciar();
        } else {
            Iterator<Lectura> iterator = lecturas.iterator();
            Lectura lectura;

            String nombre_hoja = "";
            int contador_filas = 2;
            boolean cambiar = true;

            while (iterator.hasNext()) {
                lectura = iterator.next();
                sdf.applyLocalizedPattern("MM-yyyy");

                if (!nombre_hoja.endsWith(sdf.format(new Date(lectura.getPeriodo().getTime())))) cambiar = true;

                if (cambiar) {
                    nombre_hoja = sdf.format(new Date(lectura.getPeriodo().getTime()));
                    if (dao == null) {
                        dao = new XLSDao();
                        dao.iniciar(nombre_hoja);
                    } else dao.crearHoja(nombre_hoja);
                    escribirCabecera(reactiva);
                    contador_filas = 2;
                    cambiar = false;
                }

                dao.crearFila(contador_filas);
                contador_filas++;
                dao.crearCelda(1);
                dao.setAnchoColumna((short) 1, 16);
                sdf.applyLocalizedPattern("dd/MM/yyyy");
                dao.escribirTexto(sdf.format(new Date(lectura.getPeriodo().getTime())));
                dao.crearCelda(3);
                dao.escribirNumero(lectura.getActiva_importada());
                dao.crearCelda(4);
                dao.escribirNumero(lectura.getActiva_exportada());
                dao.crearCelda(5);
                dao.escribirNumero(lectura.getReactiva_q1());
                dao.crearCelda(6);
                dao.escribirNumero(lectura.getReactiva_q2());
                dao.crearCelda(7);
                dao.escribirNumero(lectura.getReactiva_q3());
                dao.crearCelda(8);
                dao.escribirNumero(lectura.getReactiva_q4());
            }
        }
    }

    protected void grabarFichero(String nombre_fichero) {
        dao.guardarLibro(nombre_fichero);
        dao = null;
    }

    private void escribirCabecera(boolean reactiva) {
        dao.crearFila(1);
        dao.crearCelda(1);
        dao.escribirTexto(CABECERA_FECHA);
        dao.crearCelda(2);
        dao.escribirTexto(CABECERA_HORA);
        dao.crearCelda(3);
        dao.escribirTexto(CABECERA_ACTIVA_IMPORTADA);
        dao.crearCelda(4);
        dao.escribirTexto(CABECERA_ACTIVA_EXPORTADA);
        dao.crearCelda(5);
        dao.escribirTexto(CABECERA_REACTIVA_Q1);
        dao.crearCelda(6);
        dao.escribirTexto(CABECERA_REACTIVA_Q2);
        dao.crearCelda(7);
        dao.escribirTexto(CABECERA_REACTIVA_Q3);
        dao.crearCelda(8);
        dao.escribirTexto(CABECERA_REACTIVA_Q4);
        if (reactiva) {
            dao.crearCelda(9);
            dao.escribirTexto(" ");
            dao.crearCelda(10);
            dao.escribirTexto(CABECERA_HORARIO_ANO, dao.getColorFondo(XLSDao.COLOR_ORO));
            dao.crearCelda(11);
            dao.escribirTexto(CABECERA_PERIODO_DIA, dao.getColorFondo(XLSDao.COLOR_ORO));
            dao.crearCelda(12);
            dao.escribirTexto(CABECERA_TIPO_REACTIVA, dao.getColorFondo(XLSDao.COLOR_ORO));
            dao.crearCelda(13);
            dao.escribirTexto(CABECERA_FACTOR_POTENCIA, dao.getColorFondo(XLSDao.COLOR_ORO));
            dao.crearCelda(14);
            dao.escribirTexto(CABECERA_BONIFICACION, dao.getColorFondo(XLSDao.COLOR_ORO));
            dao.crearCelda(15);
            dao.escribirTexto(CABECERA_BONIFICACION_MAXIMA, dao.getColorFondo(XLSDao.COLOR_ORO));
            dao.crearCelda(16);
            dao.escribirTexto(CABECERA_BONIFICACION_EUROS, dao.getColorFondo(XLSDao.COLOR_ORO));
            dao.crearCelda(17);
            dao.escribirTexto(CABECERA_BONIFICACION_MAXIMA_EUROS, dao.getColorFondo(XLSDao.COLOR_ORO));
            dao.setAnchoColumna((short) 17, 24);
            dao.crearCelda(18);
            dao.escribirTexto(CABECERA_DIFERENCIA_BONIFICACION_BINIFICACION_MAXIMA, dao.getColorFondo(XLSDao.COLOR_ORO));
            dao.crearCelda(19);
            dao.escribirTexto(CABECERA_ACTIVA_EXPORTADA_CAPADA, dao.getColorFondo(XLSDao.COLOR_AZUL));

            dao.crearCelda(22);
            dao.escribirTexto(CABECERA_PORCENTAJE_BONIFICACION, dao.getColorFondo(XLSDao.COLOR_AZUL));
            dao.setAnchoColumna((short) 22, 24);
        }
    }
}